"""
使用元类控制实例的创建

问题：
    你想通过改变实例创建方式来实现单例、缓存或其他类似的特性。
解决方案：
    Python程序员都知道，如果你定义了一个类，就能像函数一样的调用它来创建实例。
"""


class Singleton(type):
    def __init__(self, *args, **kwargs):
        self.__instance = None
        super().__init__(*args, **kwargs)

    def __call__(self, *args, **kwargs):
        if self.__instance is None:
            self.__instance = super().__call__(*args, **kwargs)
            return self.__instance
        else:
            return self.__instance


class User(metaclass=Singleton):
    def __init__(self):
        print("creating User")


def use_user():
    user1 = User()
    user2 = User()
    print(user1 is user2)
    # 输出结果：
    """
    creating User
    True
    """


if __name__ == '__main__':
    use_user()
